<?php

namespace app\admin\controller;

use think\Controller;
use think\Db;
use think\Request;
use app\admin\model\Admin as AdminModel;
use think\Session;

use think\response\Json;


class Admin extends Controller
{
    // 初始化 防止用户未登录就访问页面
    public function _initialize()
    {
        if (!session('nodeList')) {
            return $this->error('您还未登录,请登录',url('admin/index/index'));
        }
    }
    /**
     * 显示管理员列表
     *
     * @return \think\Response
     */
    public function index()
    {
        $auth = request()->controller().request()->action();
        $this->judge($auth);

        // 查询所有管理员信息

        $list = Db::table('2B_admin_role ar,2B_admin a,2B_role r')
            ->field('a.id,a.real_name,a.tel,a.email,a.voucher,a.status,group_concat(r.role_name) as role')
            ->where('ar.admin_id = a.id')
            ->where('ar.role_id = r.id')
            ->group('ar.admin_id')
            ->paginate(10);


        return view('admin/index',['data' => $list]);
    }

    /**
     * 显示创建资源表单页.
     *
     * @return \think\Response
     */
    public function create()
    {
        $auth = request()->controller().request()->action();
        $this->judge($auth);

        return view('admin/create');
    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {

        // 接收添加管理员表单传过来的数据
        $admin = input('post.');

        // 验证数据库是否存在
        $reTel = Db::name('admin')->where('tel', 'eq', $admin['tel'])->select();
        $reEmail = Db::name('admin')->where('email', 'eq', $admin['email'])->select();
        $reIdCard = Db::name('admin')->where('id_card', 'eq', $admin['id_card'])->select();

        if (!empty($reTel)){
            return $this->error('您的用户名(手机号)已经有人占用了,请换一个吧!!!');
        }
        if (!empty($reEmail)){
            return $this->error('这个邮箱已经有人用了,换一个吧!!!');
        }
        if (!empty($reIdCard)){
            return $this->error('这个身份证已经有人用了,换一个吧!!!');
        }

        // 验证器验证数据
        $check = $this->validate($admin, 'admin/Admin');
        if (true !== $check) {
            $this->error($check);
            return;
        }

        // 设置用户唯一凭证
        $admin['voucher'] = rand(1000,9999).rand(1000,9999);

        // 模型处理
        $ModelAdmin = new AdminModel($admin);

        // 将密码使用盐值加密
        $ModelAdmin->password = $ModelAdmin->setPass(input('post.password'));



        // 过滤数组多余元素并保存到数据库
        $result = $ModelAdmin->allowField(true)->save();

        // 判断是否添加成功
        if ($result > 0){
            return $this->success('添加成功!', url('admin/admin/index'));
        }else{
            return $this->error('添加失败!');
        }
    }

    /**
     * @return 修改管理员状态
     */
    public function status()
    {
        $auth = request()->controller().request()->action();
        $this->judge($auth);

        $id = input('get.id');
        $admin = Db::name('admin')->where('id',$id)->value('status');
        if ($admin == 1){
            $status = Db::name('admin')->where('id',$id)->update(['status' => '0']);
        }else{
            $status = Db::name('admin')->where('id',$id)->update(['status' => '1']);
        }
        return json($status);
    }

    /**

     * 管理员分配角色
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function read($id)
    {
        $auth = request()->controller().request()->action();
        $this->judge($auth);

        // 查询所有的权限名
        $list = Db::name('role')->field('id,role_name')->select();
//        halt($list);
        // 查询关于本id的权限名
        $data = Db::table('2B_admin_role ar,2B_admin a,2B_role r')
            ->field('a.id,ar.role_id,r.role_name as role')
            ->where('ar.admin_id = a.id')
            ->where('ar.role_id = r.id')
            ->where('r.status = 1')
            ->where('a.id ='.$id)
            ->select();
//        halt($data);
        // 组合数据 前台遍历
        for ($i=0; $i < count($list); $i++){
            for ($k=0; $k < count($data); $k++){
                if ($list[$i]['id']==$data[$k]['role_id']){
                    $list[$i]['checked']= true;
                }
            }
        }
//        halt($list);

        return view('admin/AssignRole',[
            'uid' => $id,
            'list' =>  $list
        ]);
    }

    // 管理员角色分配处理
    public function AdminRole()
    {
        //        接收post传过来的数据
        $role = input('post.');

        // 删除ch_user_role表中的数据
        $useredit = Db::name('admin_role')->where('admin_id ='.$role['admin_id'])->delete();

//            如果不传数据或者是选为空
        if (array_key_exists('role_name',$role) == false){
            return $this->success('角色修改成功了,该用户已经没有角色了哦!', url('admin/Admin/index'));
        }

//        定义一个空数组过滤数据
        $data = [];
        for ($i=0; $i < count($role['role_name']); $i++){
            $data[$i] = [
                'admin_id' => $role['admin_id'],
                'role_id' => $role['role_name'][$i]
            ];
        }


//        向ch_user_role表中添加数据
        for ($k=0;$k < count($data);$k++){
            $useradd = Db::name('admin_role')->data($data[$k])->insert();
        }

        if ($useradd > 0){
            return $this->success('角色修改成功了!', url('admin/Admin/index'));
        }else{
            return $this->error('角色修改失败了!请重试');
        }
    }


    /**
     * 显示编辑资源表单页.
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function edit($id)
    {
        $auth = request()->controller().request()->action();
        $this->judge($auth);

        $upAdmin = Db::name('admin')->find($id);
        return json($upAdmin);

    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request)
    {

        // 接收提交的数据
        $info = $request->put();

        // 验证数据库是否存在
        $reTel = Db::name('admin')->where('tel', 'eq', $info['tel'])->select();
        $reEmail = Db::name('admin')->where('email', 'eq', $info['email'])->select();
//        halt($reTel);
        if (!empty($reTel)) {
            if (!($reTel[0]['id'] == $info['id'])) {
                return $this->error('您的用户名(手机号)已经有人占用了,请换一个吧!!!');
            }
        }
        if (!empty($reEmail)) {
            if (!($reEmail[0]['id'] == $info['id'])) {
                return $this->error('这个邮箱已经有人用了,换一个吧!!!');
            }
        }


        // 验证器验证数据
        $check = $this->validate($info, 'admin/AdminUpdate');
        if (true !== $check) {
            $this->error($check);
            return;
        }

        // 模型处理
        $ModelAdmin = new AdminModel($info);
        // 验证原密码
        $olwPwd = $ModelAdmin->checkPass($info['id'], $info['olwpwd']);
        if (!$olwPwd) {
            return $this->error('您的旧密码不正确,请重新填写!!!');
        }

        // 将新密码使用盐值加密
        $ModelAdmin->password = $ModelAdmin->setPass($info['password']);

        // 手动过滤数组多余的数据
        $data = [
            'tel' => $ModelAdmin->tel,
            'email' => $ModelAdmin->email,
            'real_name' => $ModelAdmin->real_name,
            'password' => $ModelAdmin->password,
        ];

        //更新数据库
        $result = db('admin')->where('id', $ModelAdmin->id)->data($data)->update();

        // 判断是否添加成功
        if ($result > 0) {
            return $this->success('修改成功成功!', url('admin/admin/index'));
        } else {
            return $this->error('修改失败!');
        }
    }


    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id)
    {
        $auth = request()->controller().request()->action();
        $this->judge($auth);

        //  删除分配角色
        Db::name('admin_role')->where('admin_id','eq',$id)->delete();
        // 删除
        $delAdmin = Db::name('admin')->delete($id);
        return json($delAdmin);
        //
    }


    /*
     * 判断权限
     */
    public function judge($auth)
    {
        $nodeList = Session::get('nodeList');
        if ($nodeList =='root') {
            return;
        }
        if (empty($nodeList)) {
            return $this->error('您的权限不足!');
        }
        if (!in_array($auth,$nodeList)) {
            return $this->error('您的权限不足!');
        }
    }
}
